package cn.mg.mybatis.manager;


import cn.mg.mybatis.domain.BaseQuery;
import cn.mg.mybatis.domain.UpdateByQuery;
import cn.mg.framework.exception.DataAccessException;

import java.io.Serializable;
import java.util.List;

/**
 * @author 何兆明
 * @description
 * @create 2018/8/1 下午6:31
 */
public interface BaseDao<DO extends Serializable> {

    /**
     * 添加实体
     *
     * @param entity 要添加的实体对象
     * @return
     */
    void insert(DO entity) throws DataAccessException;


    /**
     * 新建对象或更新对象
     *
     * @param entity 要保存的实体对象
     * @return
     */
    void insertOrUpdate(DO entity) throws DataAccessException;


    /**
     * 保存实体
     *
     * @param entity 要保存的实体对象
     * @return
     */
    int update(DO entity) throws DataAccessException;


    /**
     * 更新对象
     *
     * @param uDO .entity 对象, 需要更新成什么样子，只有非空字段会被更新
     * @param uDO .date 通过查询对象判断更新的范围
     * @return
     * @throws
     */
    int updateByQuery(UpdateByQuery<DO> uDO) throws DataAccessException;


    /**
     * 根据主键删除实体
     *
     * @param pk 主键
     * @return
     */
    int deleteById(Long pk) throws DataAccessException;

    /**
     * 根据主键删除实体
     *
     * @param query 参数
     * @return
     */
    int delete(BaseQuery<DO> query) throws DataAccessException;

    /**
     * 根据主键返回指定的实体对象
     *
     * @param pk 主键
     * @return
     */
    DO getById(Long pk) throws DataAccessException;

    /**
     * 根据主键返回指定的实体对象, 会锁表
     *
     * @param pk
     * @return
     * @throws DataAccessException
     */
    DO getByIdForUpdate(Long pk) throws DataAccessException;

    /**
     * 根据sql mapping中定义的sql名称，以及传入的参数来查找实体集
     *
     * @param query 参数
     * @return
     */
    List<DO> query(BaseQuery<DO> query) throws DataAccessException;

    /**
     * 根据sql mapping中定义的sql名称，以及传入的参数来查找单个实体
     *
     * @param query 参数
     * @return
     */
    DO queryOne(BaseQuery<DO> query) throws DataAccessException;

    /**
     * 分页查询
     * 根据sql mapping中定义的sql名称，以及传入的参数来查找实体集
     *
     * @param query 参数
     * @return
     */
    List<DO> query4Page(BaseQuery<DO> query) throws DataAccessException;

    /**
     * 根据sql mapping中定义的sql名称，以及传入的参数来查找统计集
     *
     * @param query 参数
     * @return
     */
    long count(BaseQuery<DO> query) throws DataAccessException;

    void insertBatch(List<DO> subList);
}
